Матч
413, Бесконечная последовательность 2 (InfiniteSequence2)
Дивизион 1,
Уровень 2
Рассмотрим бесконечную
последовательность А, определенную следующим образом:
A0 = 1,
Ai = A[i/p]
– x + A[i/q]
– y , i ³ 1
По заданным n, p, q,
x, y вычислить An.
Класс: InfiniteSequence
Метод: long
calc(long n, int p, int q)
Ограничения: 0 £ n £ 1013,
2 £ p, q £ 109, 0 £ x, y £ 109.
Вход. Целые значения n, p, q.
Выход. Значение An.
Пример входа
n |
p |
q |
x |
y |
10000000 |
2 |
3 |
10000000 |
10000000 |
12 |
2 |
3 |
1 |
0 |
123 |
45 |
67 |
8 |
9 |
Пример выхода
2
8
2
РЕШЕНИЕ
рекурсия
Заведем массив m, для которого m[i] = Ai. Массив длины n
£ 1013 не поместится в памяти,
поэтому вычисленные значения Ai
будем запоминать лишь для i < MAX = 5000000. Для нахождения Ai при i ³ MAX используем обычную рекурсию.
ПРОГРАММА
#include <stdio.h>
#define MAX 5000000
long long m[MAX];
class InfiniteSequence2
{
public:
long long calc(long long n, int p, int q, int x, int y)
{
long long
temp;
if (n <= 0) return
1;
if ((n < MAX) && m[n]) return m[n];
temp = calc(n/p-x,p,q,x,y) + calc(n/q-y,p,q,x,y);
if (n < MAX) m[n] = temp;
return temp;
}
};